;---- Start Macro
 
;WIFI_CONFIG macro v1.2
;
; Author: Dr Jay (3D Emergency Room), edited by Lazar Jovic
;
; This macro helps configure WiFi settings on Duet 3 boards
; Supports both Client, Access Point and ethernet boards
;
; IMPORTANT WIFI REQUIREMENTS:
; - ONLY 2.4GHz networks are supported
; - 5GHz networks will NOT work
; - Dual-band networks must be split into separate 2.4GHz and 5GHz networks
;
; How to identify a 2.4GHz network:
; 1. Check your router settings - look for separate network names for 2.4GHz and 5GHz
; 2. Network names often end with "-2.4G" or "-2G" to distinguish them
; 3. 2.4GHz networks typically show lower but more stable signal strength
; 4. If using a dual-band router, ensure you've separated the bands with different SSIDs
; Initialize variables

var ssid = ""
var password = ""
var ip = ""
var gateway = ""
var subnet = ""
var mode = 0
var option = 0
var dhcp_mode = true								; Track if using DHCP
; Choose wireless mode
M552 I0 S0
M552 I1 S0
M291 P"Choose WiFi mode" R"Mode Selection" S4 K{"Client","Access Point","Ethernet","Fully Disable"}
set var.mode = input
if var.mode == 0
	; CLIENT MODE
	M291 P"WiFi Client Setup" R"Welcome" S2
	; WARNING about 2.4GHz requirement
	M291 P"WARNING: Your network MUST be 2.4GHz. 5GHz and dual-band networks will NOT work!" R"Network Requirement" S2
	M291 P"Common 2.4GHz names end with: -2.4G, -2G, _2.4GHz" R"Network Identification" S2
	M291 P"For dual-band routers: Split bands into separate networks" R"Router Setup" S2
	M291 P"Recommended: Use WPA2-PSK security and channels 1, 6, or 11" R"Network Settings" S2
	M291 P"Make sure you are connecting to a 2.4GHz network. Continue?" R"Confirm" S4 K{"Yes","No"}
	set var.option = input
	if var.option == 1
		M291 P"Setup cancelled" R"Cancelled" S2
		M99
	; Prompt for SSID
	M291 P"Enter WiFi network name (SSID)" R"Network Name" S7
	set var.option = input
	if var.option == ""
		M291 P"Setup cancelled" R"Cancelled" S2
		M99
	set var.ssid = var.option
	; Prompt for password
	M291 P"Enter WiFi password" R"Network Password" S7
	set var.option = input
	if var.option == ""
		M291 P"Setup cancelled" R"Cancelled" S2
		M99
	set var.password = var.option
	; Ask about custom IP
	M291 P"Use custom IP configuration?" R"IP Config" S4 K{"No (DHCP)","Yes"}
	set var.option = input
	if var.option == 1
		set var.dhcp_mode = false
		; Get IP address
		M291 P"Enter IP address (e.g. 192.168.1.100)" R"IP Address" S7
		set var.option = input
		if var.option == ""
			M291 P"Using DHCP" R"Info" S2
			set var.dhcp_mode = true
		else
			set var.ip = var.option
			; Get gateway
			M291 P"Enter gateway address (e.g. 192.168.1.1)" R"Gateway" S7
			set var.option = input
			set var.gateway = var.option
			; Get subnet mask
			M291 P"Enter subnet mask (e.g. 255.255.255.0)" R"Subnet" S7
			set var.option = input
			set var.subnet = var.option
	; Configure WiFi
	M291 P"Configuring WiFi..." R"Please Wait" S3
	M552 S0											; Disable network
	G4 P1000										; Wait 1 second
	M587 S{var.ssid} P{var.password}				; Configure WiFi
	; Set custom IP if provided
	if !var.dhcp_mode
		M552 I1 P{var.ip}							; Set IP address 
		M553 P{var.subnet}							; Set subnet mask global.config_version echo "M553 I1 P"^{.var.ip}
		M554 P{var.gateway}							; Set gateway
	G4 P2000										; Wait 2 seconds
	M552 I1 S1										; Enable network
	echo >"0:/sys/config_networking.g" "if !exists(global.networking)"
	echo >>"0:/sys/config_networking.g" "   global networking = 1 ; Printer is setup to connect to your local WiFi network"
	echo >>"0:/sys/config_networking.g" "M552 I0 S0 ; Disable Ethernet"
	if !var.dhcp_mode
		echo >>"0:/sys/config_networking.g" "M552 I1 P"^{var.ip}
		echo >>"0:/sys/config_networking.g" "M553 P"^{var.subnet}
		echo >>"0:/sys/config_networking.g" "M554 P"^{var.gateway}
	echo >>"0:/sys/config_networking.g" "M552 I1 S1 ; Boot the printer up with it connecting to your local WiFi network"
elif var.mode == 1
	; ACCESS POINT MODE
	M291 P"WiFi Access Point Setup" R"Welcome" S2
	; Prompt for AP name
	M291 P"Enter Access Point name" R"AP Name" S7
	set var.option = input
	if var.option == ""
		M291 P"Setup cancelled" R"Cancelled" S2
		M99
	set var.ssid = var.option
	; Prompt for AP password (minimum 8 characters)
	M291 P"Enter AP password (min 8 chars)" R"AP Password" S7
	set var.option = input
	var inputlen = #(var.option)
	if (var.option == "")
		M291 P"Invalid password" R"Error" S2
		M99
	elif(var.inputlen < 8)
		M291 P"Minimum 8 characters" R"Error" S2
		M99
	;Configure Access Point
	M291 P"Creating Access Point..." R"Please Wait" S2
	set var.password = var.option
	M552 I1 S0										; Disable network
	G4 P1000										; Wait 1 second
	M589 S{var.ssid} P{var.password} I192.168.0.1	; Configure Access Point
	G4 P2000										; Wait 2 seconds
	M552 I1 S2										; Enable network
	echo >"0:/sys/config_networking.g" "if !exists(global.networking)"
	echo >>"0:/sys/config_networking.g" "  global networking = 2 ; Printer is setup to create a local access point"
	echo >>"0:/sys/config_networking.g" "M552 I0 S0 ; Disable Ethernet"
	echo >>"0:/sys/config_networking.g" "M552 I1 S2 ; Boot the printer up in access point mode"
; Report network status
elif var.mode == 2
	; Ethernet mode
	M291 P"Ethernet Setup" R"Welcome" S2
	M291 P"Use custom IP configuration?" R"IP Config" S4 K{"No (DHCP)","Yes"}
	set var.option = input
	if var.option == 1
		set var.dhcp_mode = false
		; Get IP address
		M291 P"Enter IP address (e.g. 192.168.1.100)" R"IP Address" S7
		set var.option = input
		if var.option == ""
			M291 P"Using DHCP" R"Info" S2
			set var.dhcp_mode = true
		else
			set var.ip = var.option
			; Get gateway
			M291 P"Enter gateway address (e.g. 192.168.1.1)" R"Gateway" S7
			set var.option = input
			set var.gateway = var.option
			; Get subnet mask
			M291 P"Enter subnet mask (e.g. 255.255.255.0)" R"Subnet" S7
			set var.option = input
			set var.subnet = var.option
	; Configure Network
	M291 P"Configuring Network" R"Please Wait" S3
	G4 P1000										; Wait 1 second
	; Set custom IP if provided
	if !var.dhcp_mode
		M552 I1 P{var.ip}							; Set IP address
		M553 P{var.subnet}						; Set subnet mask
		M554 P{var.gateway}						; Set gateway
	G4 P2000										; Wait 2 seconds
	M552 I0 S1										; Enable network
	set global.networking = 3
	echo >"0:/sys/config_networking.g" "if !exists(global.networking)"
	echo >>"0:/sys/config_networking.g" "   global networking = 3 ; Printer is setup to in Ethernet mode"
	echo >>"0:/sys/config_networking.g" "M552 I0 S1 ; Enable Ethernet"
	if !var.dhcp_mode
		echo >>"0:/sys/config_networking.g" "M552 I0 P"^{var.ip}
		echo >>"0:/sys/config_networking.g" "M553 P"^{var.subnet}
		echo >>"0:/sys/config_networking.g" "M554 P"^{var.gateway}
	echo >>"0:/sys/config_networking.g" "M552 I1 S0 ; Disable WiFi"
elif var.mode == 3
	M552 I0 S0 ; Disable Ethernet
	M552 I1 S0 ; Disable WiFi
	G4 S1 ; wait 1 second
	set global.networking = 0
	echo >"0:/sys/config_networking.g" "if !exists(global.networking)"
	echo >>"0:/sys/config_networking.g" "   global networking = 0 ; Networking is disabled"
	echo >>"0:/sys/config_networking.g" "M552 I0 S0 ; Disabled Ethernet"
	echo >>"0:/sys/config_networking.g" "M552 I1 S0 ; Disable WiFi"

; Final message
if var.mode == 0
	M552 I1
	M291 P"WiFi client setup complete. Check connection status above." R"Complete" S2
if var.mode == 1
	M291 P"Access Point created. SSID: " ^ {var.ssid} R"Complete" S2
if var.mode == 2
	M552 I0
	M291 S2 R"Ethernet mode enabled" P"Your printer will now connect to your local network via Ethernet"
if var.mode == 3
	M291 S2 R"Networking Disabled" P"Your printer's networking has been disabled"
; Clear sensitive data
set var.ssid = ""
set var.password = ""
set var.ip = ""
set var.gateway = ""
set var.subnet = ""
; Recommend power cycle
M291 P"Please power cycle your printer to ensure network settings are properly applied" R"Power Cycle" S3
;--- End macro
